package config

import (
	"database/sql"
	"github.com/spf13/viper"
	"log"
	"os"
	"time"

	"github.com/go-redis/redis/v7"
	// 这个引用是必不可少的，因为需要调用driver.go文件里的init方法来提供一个数据库驱动程序
	_ "github.com/go-sql-driver/mysql"
)

// DB 全局变量，方便别处调用
var DB *sql.DB

// RedisClient 全局变量，方便别处调用
var RedisClient *redis.Client

// Init 读取初始化配置文件
func Init() error {

	// 初始化配置文件
	if err := Config(); err != nil {
		return err
	}

	// 初始化日志包
	LogInit()

	// 初始化数据库
	SQLInit()

	// 初始化缓存
	RedisInit()

	return nil
}

// LogInit 初始化日志配置
func LogInit() {
	file := "./log/" + time.Now().Format("2006-01-02") + ".log"
	logFile, _ := os.OpenFile(file, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0766)
	log.SetFlags(log.Ldate | log.Ltime | log.Lshortfile)
	log.SetOutput(logFile)
}

// Config viper解析配置文件
func Config() error {
	viper.AddConfigPath("conf")
	viper.SetConfigName("config")
	if err := viper.ReadInConfig(); err != nil {
		return err
	}

	return nil
}

// SQLInit MySQL初始化
func SQLInit() {
	var err error

	// 初始化一个sql.DB对象
	DB, err = sql.Open("mysql", viper.GetString("mysql.source_name"))
	if nil != err {
		panic(err)
	}

	// 设置最大超时时间
	DB.SetMaxIdleConns(viper.GetInt("mysql.max_idle_conns"))
	DB.SetMaxOpenConns(viper.GetInt("mysql.max_open_conns"))

	// 建立链接
	err = DB.Ping()
	if nil != err {
		panic(err)
	} else {
		log.Println("MySQL start ok!")
	}
}

// RedisInit redis初始化
func RedisInit() {
	RedisClient = redis.NewClient(&redis.Options{
		Addr:               viper.GetString("redis.addr"),     // "127.0.0.1:6379",
		Password:           viper.GetString("redis.password"), // "",
		Dialer:             nil,
		OnConnect:          nil,
		DB:                 viper.GetInt("redis.db"), // 0,
		MaxRetries:         0,
		MinRetryBackoff:    0,
		MaxRetryBackoff:    0,
		DialTimeout:        0,
		ReadTimeout:        0,
		WriteTimeout:       0,
		PoolSize:           200,
		MinIdleConns:       0,
		MaxConnAge:         0,
		PoolTimeout:        0,
		IdleTimeout:        0,
		IdleCheckFrequency: 0,
		TLSConfig:          nil,
	})
	_, err := RedisClient.Ping().Result()
	if err != nil {
		panic(err)
	} else {
		log.Println("Redis start ok!")
	}
}
